#include "../EventLoopThread.h"

using namespace yhaida;

EventLoopThread::EventLoopThread(const ThreadInitCallback &cb)
    : _mainEventLoop(NULL),
      _isStop(false),
      _mutex(),
      _cv(_mutex),
      _threadOFEventLoop(std::bind(&EventLoopThread::threadFunc, this), "EventLoopThread"),
      _callback(cb)
{
}
EventLoopThread::~EventLoopThread()
{
    _isStop = true;
    _mainEventLoop->quit();
    _threadOFEventLoop.join();
}

EventLoop *EventLoopThread::startLoop()
{
    assert(!_threadOFEventLoop.started());
    _threadOFEventLoop.start();
    {
        MutexLockGuard guard(_mutex);
        while (_mainEventLoop == NULL)
        {
            _cv.wait();
        }
    }
    return _mainEventLoop;
}

void EventLoopThread::threadFunc()
{
    EventLoop eventLoop;

    //线程初始回调函数
    if (_callback)
    {
        _callback(&eventLoop);
    }

    {
        MutexLockGuard guard(_mutex);
        _mainEventLoop = &eventLoop;
        _cv.notify();
    }

    _mainEventLoop->loop();

    //收尾
    {
        MutexLockGuard guard(_mutex);
        _mainEventLoop = NULL;
    }
}